#pragma once

#include <memory>

class Desktop;

class ScopedThreadDesktop {
public:
	ScopedThreadDesktop();
	~ScopedThreadDesktop();

	// Returns true if |desktop| has the same desktop name as the currently
	// assigned desktop (if assigned) or as the initial desktop (if not assigned).
	// Returns false in any other case including failing Win32 APIs and
	// uninitialized desktop handles.
	bool IsSame(const Desktop& desktop);

	// Reverts the calling thread to use the initial desktop.
	void Revert();

	// Assigns |desktop| to be the calling thread. Returns true if the thread has
	// been switched to |desktop| successfully. Takes ownership of |desktop|.
	bool SetThreadDesktop(Desktop* desktop);

private:
	// The desktop handle assigned to the calling thread by Set
	std::unique_ptr<Desktop> assigned_;

	// The desktop handle assigned to the calling thread at creation.
	std::unique_ptr<Desktop> initial_;

	ScopedThreadDesktop(const ScopedThreadDesktop&) = delete;
	ScopedThreadDesktop& operator=(const ScopedThreadDesktop&) = delete;
};

